// Dart 继承示例：Person 与 Student

// 父类：Person
class Person {
  String name;
  int age;

  // 构造函数
  Person(this.name, this.age);

  // 命名构造函数
  Person.named({required this.name, required this.age});

  // 普通方法
  void introduce() {
    print("Hi, I'm $name and I'm $age years old.");
  }

  // 可被重写的方法
  void work() {
    print("$name is working.");
  }
}

// 子类：Student 继承 Person
class Student extends Person {
  String school;

  // 调用父类构造函数
  Student(String name, int age, this.school) : super(name, age);

  // 命名构造函数 + 父类命名构造函数
  Student.named({required String name, required int age, required this.school})
    : super.named(name: name, age: age);

  // 重写父类方法
  @override
  void work() {
    print("$name is studying hard at $school.");
  }

  // 子类特有方法
  void study() {
    print("$name is doing homework.");
  }

  // 调用父类方法
  void showParentBehavior() {
    super.work();
  }
}

// 测试入口 main()
void main() {
  // 使用普通构造函数
  var p = Person("Alice", 30);
  p.introduce();
  p.work();

  print("-----");

  // 使用子类构造函数
  var s = Student("Bob", 18, "Tech University");
  s.introduce(); // 继承自父类
  s.work(); // 重写后的方法
  s.study(); // 子类独有方法
  s.showParentBehavior(); // 调用父类 work()

  print("-----");

  // 使用命名构造函数
  var s2 = Student.named(name: "Charlie", age: 20, school: "Dart Academy");
  s2.introduce();
  s2.work();

  print("-----");

  // 多态演示：父类引用指向子类对象
  Person p2 = Student("David", 22, "University of Dart");
  p2.work(); // 调用的是子类重写后的方法
}
